iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 25

J - using hardcoded keys (不安全的身份驗證:使用硬編碼的金鑰)

  • 分享至 

  • xImage
  •  

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

J - using hardcoded keys (不安全的身份驗證:使用硬編碼的金鑰)

  • 形成原因:開發者因為偷懶、怕自己忘記或是為了DEBUG而將加密金鑰或憑證直接硬編碼在程式碼中
  • 後果:簡單一點滑鼠左鍵>檢視原始碼即可獲得敏感資訊,或是透過反編譯工具取得放置在程式中的敏感資訊。
  • 實例:一些工程師在開發網站時將一些資訊,如密鑰、伺服器版本、資料庫版本等資訊透過註解方式遺留在網頁原始碼中。
  • 解決方法:將金鑰儲存在安全憑證管理系統中,避免硬編碼,並使用動態金鑰管理方式

第1題

錯誤區塊

String connectionUrl = "https://www.bankingApp.com/moneytransfer.php";
String postParams = "account_number=" + edtAccountNumber.getText().toString() + "&" + "amount=" + edtAmount.getText().toString() + "&" + "transaction_password=" + edtTransactionPassword.getText().toString() + "&" + "api_key=A4sfK4365GITkdfier577dgfkDFJKF==";
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
可以直觀地看到api_key=A4sfK4365GITkdfier577dgfkDFJKF==

主要修正方法

"user_id=" + userId + "&" + "token=" + accessToken;
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
使用會隨時間及使用者資料更新的token取代硬編碼。

第2題

錯誤區塊

private final String key = "8w6n64J6CiPkU4atWBvoVhb7Cextl1oF";
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
硬編碼

主要修正方法

選有

import android.security.keystore.KeyGenParameterSpec;

KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder("myKeyAlias", KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
    .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
    .build();
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
KeyGenParameterSpec 是 Android 用於配置和生成加密金鑰的類別,通過將金鑰存儲於 Android Keystore 中,確保金鑰不會直接暴露給應用程式本身或反編譯分析,提供更高級別的安全保護。

第3題

錯誤區塊

(!TextUtils.isEmpty(credentials)) {
    cipherString = new String(AES256Cipher.encrypt(new String("dGhpc0BrZXklaXMgbm90ICUlIFZsaUQ=").getBytes(), credentials.getBytes()));
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
使用硬編碼

主要修正方法

CipherSecurity secure = new CipherSecurity();
secure.createNewKeys(LoginActivity.this, alias);
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
使用 CipherSecurity 類別來創建新的加密金鑰,他一樣會將金鑰存儲於 Android Keystore 中,確保金鑰的隱私性。


上一篇
J - reuse of initialization vector (不合標準的密碼術:重複利用初始化向量)
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言